package org.pray.nio;

import java.io.*;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.CharBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.*;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.Iterator;
import java.util.Objects;
import java.util.Set;
import java.util.function.IntPredicate;

/**
 * NIOS
 *
 * @author 春江花朝秋月夜
 * @since 2024/2/16 16:36
 */
public class NIOS {
    public static void main(String[] args) throws IOException {
        FileOutputStream write = new FileOutputStream(new File("D:\\design-mode\\src\\main\\java\\org\\pray\\asm\\write.asc"));
        FileChannel writeChannel = write.getChannel();//通道是可以写可以读的，命名不应该给予暗示
        writeChannel.write(ByteBuffer.wrap("伞兵一号卢本伟准备就绪，从现在开始，这里叫卢本伟广场！".getBytes()));
//
//        //读取操作
//        //1.先获取流，打开 通道
//        //2.获取缓冲Buffer，相当于获取一个桶
//        //3.通过通道来读（read）桶buffer；
//        //4.翻转桶
//        ByteBuffer allocate = ByteBuffer.allocate(128);
//        channel.read(allocate);
//        allocate.flip();
//        new String(allocate.array(),0,allocate.remaining());
//        //发现报错，所以从文件流导出的通道具有文件流的特性，例如FileInputStream和FileOutputStream

        try (//改用RandomAccessFile创建通道
            RandomAccessFile accessFile = new RandomAccessFile("D:\\design-mode\\src\\main\\java\\org\\pray\\asm\\write.asc","rw")) {
            FileChannel channel = accessFile.getChannel();
            //截断文件位置
            channel.truncate(13);
            ByteBuffer buffer = ByteBuffer.allocate((int) channel.size());
            channel.read(buffer);
            buffer.flip();
            String res = new String(buffer.array(), 0, buffer.remaining());
            System.out.println(res);
            //要编辑某个文件时，通过使用MappedByteBuffer类，可以将其映射到内存中进行编辑，编辑的内容会同步更新到文件中：
            //创建方法是通过文件通道创建
            MappedByteBuffer mappedByteBuffer=channel.map(FileChannel.MapMode.READ_WRITE, 14, 20);
               //我们可以直接对在内存中的数据进行编辑，也就是编辑Buffer中的内容
            //注意这里写入也是从pos位置开始的，默认是从0开始，相对于文件就是从第四个字节开始写
            //注意我们只映射了10个字节，也就是写的内容不能超出10字节了
            mappedByteBuffer.put("yyds".getBytes());

            //编辑完成后，通过force方法将数据写回文件的映射区域
            mappedByteBuffer.force();
        }
    }
}
